<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// async函数(异步函数)
// async函数意味着函数内部有异步操作
// async是一个修饰符,用于修饰函数
// async函数执行后返回一个promise对象

// function fn1(){}// 普通函数
// async function fn2(){}// async函数
// let res1 = fn1();
// let res2 = fn2();
// console.log( res1 );// undefined
// console.log( res2 );// Promise {<fulfilled>: undefined}

async function test(){
    // 如何改变p1的状态和结果
    // 1.返回非Promise对象时,p1为成功状态,结果为return返回的值
    // return false;
    // return 1234;

    // 2.返回Promise对象时,p1的状态和结果跟随返回的promsie对象
    // return new Promise((resolve,reject)=>{
    //     // resolve(123);
    //     reject(456);
    // })

    // 3.出现异常情况,p1为失败状态,结果为异常信息
    // console.leg( 'hello' );
    // throw 666;
}
// let p1 = test();
// p1.then(
//     (res)=>{
//         console.log( 'p1成功',res );
//     },
//     (res)=>{
//         console.log( 'p1失败',res );
//     }
// )


// await命令
// await等待,等待异步完成(通常是等待后面的promise对象成功的结果)   如果失败通常为函数的返回值
// await后面可以放任意表达式,通常后面跟Promise对象
// await命令必须在async函数内部使用!!!
// 执行完await命令后,会跳出当前async函数执行流 
// 一个async函数内部有多个await时，第一个await会跳出当前的执行流，后面的await不会跳出
async function test2(){
    // await后面为非Promise对象时: 
    // let res1 = 2 + 5;
    // let res1 = await 2 + 5;
    // console.log( res1 );// 7

    // await后面为Promise对象时: 
    console.log( '任务1' );
    let res2 = await new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log( '任务2' );
            // resolve(123);
            reject(456);// await后面的promise对象为失败状态时(未处理失败状态),async函数执行结束,剩余程序不再执行
        },1234)
    })
    .catch((res)=>{
        console.log( res );// 456
    })
    console.log( res2 );// 123 await等待到Promise对象成功的结果

    try{
        var res3 = await new Promise((resolve,reject)=>{
            setTimeout(()=>{
                console.log( '任务3' );
                // resolve(123);
                reject(789);// await后面的promise对象为失败状态时(未处理失败状态),async函数执行结束,剩余程序不再执行
            },1234)
        })
    } catch(res){
        console.log( res );
    }
    console.log( res3 );

    console.log( '任务4' );
    // return undefined
}
let p2 = test2();
p2.then(
    (res)=>{
        console.log( 'p2成功',res );
    },
    (res)=>{
        console.log( 'p2失败',res );
    }
)

</script>
</body>
</html>